home *** CD-ROM | disk | FTP | other *** search
/ GameStar 2004 April / Gamestar_61_2004-04_dvdb.iso / DVDStar / Editace / hltp.exe / {app} / Applications / QuArK / quarkpy / mapmenus.py < prev    next >
Text File  |  2004-01-05  |  16KB  |  465 lines

  1. """   QuArK  -  Quake Army Knife
  2.  
  3. Map editor pop-up menus.
  4. """
  5. #
  6. # Copyright (C) 1996-99 Armin Rigo
  7. # THIS FILE IS PROTECTED BY THE GNU GENERAL PUBLIC LICENCE
  8. # FOUND IN FILE "COPYING.TXT"
  9. #
  10.  
  11. #$Header: /cvsroot/quark/runtime/quarkpy/mapmenus.py,v 1.12 2003/12/13 22:13:39 cdunde Exp $
  12.  
  13.  
  14.  
  15. import quarkx
  16. from qdictionnary import Strings
  17. import qmenu
  18. import qhandles
  19. from maputils import *
  20. import mapcommands
  21. import bspcommands
  22. import plugins.map1addonsamendmenu
  23. import plugins.map1addonsmenu
  24. import mapselection
  25. import mapbtns
  26. from mapentities import CallManager
  27.  
  28.  
  29. def ViewGroup1click(m):
  30.     editor = mapeditor(SS_MAP)
  31.     if editor is None: return
  32.     m.items = ViewGroupMenu(editor)
  33.  
  34. def EscClick(m):
  35.     editor = mapeditor(SS_MAP)
  36.     if editor is None: return
  37.     if editor.layout.mpp.n:
  38.         editor.layout.mpp.viewpage(0)
  39.     else:
  40.         editor.layout.explorer.uniquesel = None
  41.  
  42.  
  43. EditMenuCmds = [#qmenu.item("Remove selection", EscClick, "|The first time to press Esc, you are sent back to the 1st page; the second time, or if you where already at the 1st page, the currently selected objects are unselected."),
  44.                 #qmenu.sep,
  45.                 qmenu.popup("View Group", [], ViewGroup1click, "|options for groups", "intro.mapeditor.menu.html#viewgroup")]
  46. EditMenuShortcuts = {}
  47. #MapHotKeyList("Remove",  EditMenuCmds[0], EditMenuShortcuts)
  48.  
  49.  
  50. #
  51. # QuickKey shortcuts
  52. #
  53.  
  54. def GridMinus(editor, view=None):
  55.     editor.setgrid(editor.gridstep*0.5)
  56.  
  57. def GridPlus(editor, view=None):
  58.     editor.setgrid(editor.gridstep*2.0)
  59.  
  60. def ZoomIn(editor, view=None):
  61.     scale = commonscale(editor.layout.views)
  62.     if not scale:
  63.         scale = 1.0
  64.     scale = scale*qhandles.MOUSEZOOMFACTOR
  65.     if scale>100:
  66.         scale=100 #DECKER clamp zoom-in
  67.     setviews(editor.layout.views, "scale", scale)
  68.  
  69. def ZoomOut(editor, view=None):
  70.     scale = commonscale(editor.layout.views)
  71.     if not scale:
  72.         scale = 1.0
  73.     scale = scale/qhandles.MOUSEZOOMFACTOR
  74.     if scale<0.01:
  75.         scale=0.01 #DECKER clamp zoom-out
  76.     setviews(editor.layout.views, "scale", scale)
  77.  
  78. def MoveLeft(editor, view=None):
  79.     editor.movekey(view, -1,0)
  80.  
  81. def MoveRight(editor, view=None):
  82.     editor.movekey(view, 1,0)
  83.  
  84. def MoveUp(editor, view=None):
  85.     editor.movekey(view, 0,-1)
  86.  
  87. def MoveDown(editor, view=None):
  88.     editor.movekey(view, 0,1)
  89.  
  90. # Note: the function *names* are used to look up the key from Defaults.qrk
  91. QuickKeys = [GridMinus, GridPlus, ZoomIn, ZoomOut,
  92.              MoveLeft, MoveRight, MoveUp, MoveDown]
  93.  
  94.  
  95. #
  96. # Menu bar builder
  97. #
  98. def BuildMenuBar(editor):
  99.     import mapmgr
  100.     import mapcommands
  101.     import mapsearch
  102.     import mapquakemenu
  103.     import maptools
  104.     import mapoptions
  105.  
  106.     if "Bsp" in editor.fileobject.classes:
  107.         File1, sc1 = qmenu.DefaultFileMenuBsp()
  108.     else:
  109.         File1, sc1 = qmenu.DefaultFileMenu()
  110.  
  111.     if editor.layout is None:
  112.         l1 = []
  113.         lcls = None
  114.         lclick = None
  115.     else:
  116.         l1, sc2 = editor.layout.getlayoutmenu()
  117.         sc1.update(sc2)   # merge shortcuts
  118.         if len(l1):
  119.             l1.append(qmenu.sep)
  120.         lcls = editor.layout.__class__
  121.         lclick = editor.layout.layoutmenuclick
  122.     for l in mapmgr.LayoutsList:
  123.         m = qmenu.item('%s layout' % l.shortname, editor.setlayoutclick, "switch to layout '%s'" % l.shortname)
  124.         m.state = (l is lcls) and qmenu.radiocheck
  125.         m.layout = l
  126.         l1.append(m)
  127.     Layout1 = qmenu.popup("&Layout", l1, lclick)
  128.  
  129.     Edit1, sc2 = qmenu.DefaultEditMenu(editor)
  130.     sc1.update(sc2)   # merge shortcuts
  131.     l1 = EditMenuCmds + MenuTexFlags(editor)
  132.     if len(l1):
  133.         Edit1.items = Edit1.items + [qmenu.sep] + l1
  134.     sc1.update(EditMenuShortcuts)   # merge shortcuts
  135.  
  136.     Search1, sc2 = mapsearch.SearchMenu()
  137.     sc1.update(sc2)   # merge shortcuts
  138.  
  139.     if "Bsp" in editor.fileobject.classes:
  140.         Commands1, sc2 = bspcommands.CommandsMenu()
  141.     else:
  142.         Commands1, sc2 = mapcommands.CommandsMenu()
  143.     sc1.update(sc2)   # merge shortcuts
  144.  
  145.     Addons1, sc2 = plugins.map1addonsmenu.AddonsMenuCmds()
  146.     sc1.update(sc2)   # merge shortcuts
  147.     l1 = plugins.map1addonsamendmenu.AmendMenuCmds
  148.     l2 = [qmenu.sep]
  149.     if len(l1):
  150.         Addons1.items = l1 + l2 + Addons1.items
  151.         sc1.update(sc2)   # merge shortcuts
  152.  
  153.     Selection1, sc2 = mapselection.SelectionMenu()
  154.     sc1.update(sc2)   # merge shortcuts
  155.  
  156.     Quake1, sc2 = mapquakemenu.QuakeMenu(editor)
  157.     sc1.update(sc2)   # merge shortcuts
  158.  
  159.     Tools1, sc2 = maptools.ToolsMenu(editor, maptools.toolbars)
  160.     sc1.update(sc2)   # merge shortcuts
  161.  
  162.     Options1, sc2 = mapoptions.OptionsMenu()
  163.     sc1.update(sc2)   # merge shortcuts
  164.     l1 = plugins.mapgridscale.GridMenuCmds
  165.     l2 = [qmenu.sep]
  166.     if len(l1):
  167.         Options1.items = l1 + l2 + Options1.items
  168.         sc1.update(sc2)   # merge shortcuts
  169.  
  170.     return [File1, Layout1, Edit1, quarkx.toolboxmenu,
  171.      Search1, Commands1, Addons1, Selection1, Quake1, Tools1, Options1], sc1
  172.  
  173.  
  174.  
  175. def ViewGroupMenu(editor):
  176.  
  177.     grouplist = filter(lambda o: o.type==':g', editor.layout.explorer.sellist)
  178.  
  179.     onclick = mapbtns.groupview1click
  180.     X0 = qmenu.item("Group is &visible",    onclick, "display the group normally")
  181.     X1 = qmenu.item("Group is &grayed out", onclick, "always gray out the group")
  182.     X2 = qmenu.item("Group is &hidden",     onclick, "completely hide the group")
  183.     menulist = [X0, X1, X2, qmenu.sep]
  184.     for text, flag, hint in (
  185.       ("Hide on &textured views", VF_HIDEON3DVIEW, "don't show on 'camera' views"),
  186.       ("&Cannot select with the mouse", VF_CANTSELECT, "cannot select by clicking on map views"),
  187.       ("&Ignore to build maps", VF_IGNORETOBUILDMAP, "|Groups with this flag are not included in the map when you select commands from the '"+quarkx.setupsubset().shortname+"' menu. This lets you disable parts of the map that you don't want to try playing now.\n\nNote that you can force this flag to be ignored and all groups to be included, thanks to the corresponding command in the 'Options' menu.")):
  188.         m = qmenu.item(text, onclick, hint)
  189.         m.flag = flag
  190.         menulist.append(m)
  191.  
  192.     if len(grouplist)==0:
  193.         for m in menulist:
  194.             if m is not qmenu.sep:
  195.                 m.state = qmenu.disabled
  196.     else:
  197.         common = 0
  198.         mode1 = None
  199.         for g in grouplist:
  200.             try:
  201.                 viewstate = int(g[";view"])
  202.             except:
  203.                 viewstate = 0
  204.             common = common | viewstate
  205.             viewstate = viewstate & (VF_GRAYEDOUT|VF_HIDDEN)
  206.             if mode1 is None:
  207.                 mode1 = viewstate
  208.             elif mode1 != viewstate:
  209.                 mode1 = -1
  210.         X0.flag = 0
  211.         X1.flag = VF_GRAYEDOUT
  212.         X2.flag = VF_HIDDEN
  213.         for m in menulist[:3]:
  214.             m.state = (mode1==m.flag) and qmenu.radiocheck
  215.         for m in menulist[4:]:
  216.             m.state = (common & m.flag) and qmenu.checked
  217.  
  218.     return menulist
  219.  
  220.  
  221. def BackgroundMenu(editor, view=None, origin=None):
  222.     "Menu that appears when the user right-clicks on nothing."
  223.  
  224.     undo, redo = quarkx.undostate(editor.Root)
  225.     if undo is None:   # to undo
  226.         Undo1 = qmenu.item(Strings[113], None)
  227.         Undo1.state = qmenu.disabled
  228.     else:
  229.         Undo1 = qmenu.macroitem(Strings[44] % undo, "UNDO", "undo the previous action (unlimited)")
  230.     if redo is None:
  231.         extra = []
  232.     else:
  233.         extra = [qmenu.macroitem(Strings[45] % redo, "REDO", "redo what you have just undone")]
  234.     if origin is None:
  235.         paste1 = qmenu.item("Paste", editor.editcmdclick, "paste from clipboard")
  236.     else:
  237.         paste1 = qmenu.item("Paste here", editor.editcmdclick, "paste objects at '%s'" % str(editor.aligntogrid(origin)))
  238.         paste1.origin = origin
  239.     paste1.cmd = "paste"
  240.     paste1.state = not quarkx.pasteobj() and qmenu.disabled
  241.     extra = extra + [qmenu.sep, paste1]
  242.     if view is not None:
  243.         def backbmp1click(m, view=view, form=editor.form):
  244.             import qbackbmp
  245.             qbackbmp.BackBmpDlg(form, view)
  246.         backbmp1 = qmenu.item("Background image...", backbmp1click, "choose background image")
  247.         extra = extra + [qmenu.sep] + TexModeMenu(editor, view) + [qmenu.sep, backbmp1]
  248.     return [mapcommands.NewItem1, Undo1] + extra
  249.  
  250.  
  251.  
  252. def set_mpp_page(btn):
  253.     "Switch to another page on the Multi-Pages Panel."
  254.  
  255.     editor = mapeditor(SS_MAP)
  256.     if editor is None: return
  257.     editor.layout.mpp.viewpage(btn.page)
  258.  
  259.  
  260. #def NoTexFlags():
  261. #    "true when the current game doesn't use Texture Flags"
  262. #    game = quarkx.setupsubset().shortname
  263. #    return game=="Quake 3"
  264.  
  265. #
  266. # Texture Flags pop-up menu.
  267. #
  268.  
  269. def MenuTexFlags(editor):
  270.     if editor.texflags:
  271.  
  272.         def tfclick(m, editor=editor):
  273.  
  274.             #if NoTexFlags(): return None
  275.  
  276.             def checklist(flist, items):
  277.                for p in items:
  278.                   if p is not qmenu.sep:
  279.                     spec = p.spec
  280.                     check = 0
  281.                     for face, default in flist:
  282.                         s = face[spec]
  283.                         if not s:
  284.                             if default is not None:
  285.                                 s = default[spec]
  286.                             if not s:
  287.                                 break
  288.                         try:
  289.                             n = int(s)
  290.                         except:
  291.                             break
  292.                         if not (n&p.n):
  293.                             break
  294.                     else:
  295.                         if len(flist):
  296.                             check = qmenu.checked
  297.                         else:
  298.                             check = qmenu.disabled
  299.                     p.state = check
  300.  
  301.  
  302.  
  303.             if not len(m.items):
  304.  
  305.                 def flag1click(m, editor=editor):
  306.                     flist = editor.layout.loadtfflist()
  307.                     undo = quarkx.action()
  308.                     setme = not m.state
  309.                     for face, default in flist:
  310.                         s = face[m.spec]
  311.                         if (not s) and (default is not None):
  312.                             s = default[m.spec]
  313.                         try:
  314.                             n = int(s)
  315.                         except:
  316.                             n = 0
  317.                         if setme:
  318.                             n = n | m.n
  319.                         else:
  320.                             n = n &~ m.n
  321.                         undo.setspec(face, m.spec, `n`)
  322.                     undo.ok(editor.Root, Strings[596])
  323.  
  324.  
  325.                 def makelist(formname, sep1, flag1click=flag1click):
  326.                   flist =  quarkx.getqctxlist(":form", formname)
  327.                   if not len(flist):
  328.                     raise formname+" form not found"
  329.                   form = flist[-1]
  330.                   l1 = []
  331.                   for p in form.subitems:
  332.                     s = p["Typ"]
  333.                     if s[:1] == "X":    # check box
  334.                         try:
  335.                             n = int(s[1:])
  336.                         except:
  337.                             n = 0
  338.                         if n:
  339.                             if sep1:
  340.                                 l1.append(qmenu.sep)
  341.                                 sep1 = 0
  342.                             m1 = qmenu.item(p["Cap"], flag1click, p["Hint"])
  343.                             m1.spec = p.shortname
  344.                             m1.n = n
  345.                             l1.append(m1)
  346.                     elif s == "S":    # separator
  347.                         sep1 = 1
  348.                   return l1
  349.  
  350.  
  351.                 def makeflagsclick(form, label, title, help="", editor=editor):
  352.                    item = qmenu.item(label, editor.layout.flagsclick2, help);
  353.                    item.whatform = form
  354.                    item.floattitle= title
  355.                    return item
  356.                    
  357.                 
  358.                 game = quarkx.setupsubset().shortname
  359.                 if game == "Sin":
  360.                   cont = makelist("ContFlags",0)
  361.                   surf = makelist("SurfFlags",0)
  362.                   l1 = [qmenu.item("All Flags/Reset",
  363.                           editor.layout.flagsclick, "All the flags"),
  364.                         qmenu.popup("Content Flags",cont), 
  365.                         qmenu.popup("Surface Flags",surf)] 
  366.                 else:
  367.                   l1 = [qmenu.item("&Flags...", editor.layout.flagsclick, "open the flags window")]
  368.                   l1[2:] = makelist("TextureFlags",1)
  369.                 m.items = l1
  370.              
  371.             flist = editor.layout.loadtfflist()
  372.             game = quarkx.setupsubset().shortname
  373.             if game == "Sin":
  374.                checklist(flist, m.items[1].items)
  375.                checklist(flist, m.items[2].items)
  376.             else:
  377.                checklist(flist, m.items[2:])
  378.         texpop = qmenu.popup("Texture Flags", [], tfclick, "|surface property flags", "intro.texturebrowser.details.html#textureflags")
  379.         #if NoTexFlags():
  380.         #   texpop.state = qmenu.disabled
  381.         #   texpop.hint = "|No Texture Flags for Quake 3; their function is performed by shaders."
  382.         return [texpop]
  383.     else:
  384.         return []
  385.  
  386.  
  387.  
  388. #
  389. # Entities pop-up menus.
  390. #
  391.  
  392. def EntityMenuPart(sellist, editor):
  393.  
  394.     Spec1 = qmenu.item("&Specifics...", set_mpp_page, "view Specifics/Args")
  395.     Spec1.page = 1
  396.     Spec1.state = qmenu.default
  397.  
  398.     return [Spec1, qmenu.sep]
  399.  
  400.  
  401.  
  402. def MultiSelMenu(sellist, editor):
  403.  
  404.     Spec1 = qmenu.item("&Multiple specifics...", set_mpp_page, "Specifics/Args common to all entities")
  405.     Spec1.page = 1
  406.     Spec1.state = qmenu.default
  407.     Tex1 = qmenu.item("&Texture...", mapbtns.texturebrowser, "choose texture of polyhedrons")
  408.  
  409.     return [Spec1, Tex1, qmenu.sep] + BaseMenu(sellist, editor)
  410.  
  411.  
  412.  
  413. def BaseMenu(sellist, editor):
  414.     "The base pop-up menu for a given list of objects."
  415.  
  416.     mult = len(sellist)>1 or (len(sellist)==1 and sellist[0].type==':g')
  417.     Force1 = qmenu.item(("&Force to grid", "&Force everything to grid")[mult],
  418.       editor.ForceEverythingToGrid, "|This command forces the selected object(s) to the grid. It snaps their center to the nearest grid point.\n\nNote that for a polyhedron, this forces its center to the grid, not all its faces. For cubic polyhedron, you may need to divide the grid size by two before you get the expected results.")
  419.     Force1.state = not editor.gridstep and qmenu.disabled
  420.  
  421.  
  422.     Cancel1 = qmenu.item("&Cancel Selections", mapselection.EscClick, "cancel all items selected")
  423.     #Cut1.cmd = "cut"
  424.     Cut1 = qmenu.item("&Cut", editor.editcmdclick, "cut this to the clipboard")
  425.     Cut1.cmd = "cut"
  426.     Copy1 = qmenu.item("Cop&y", editor.editcmdclick, "copy this to the clipboard")
  427.     Copy1.cmd = "copy"
  428.     Delete1 = qmenu.item("&Delete", editor.editcmdclick, "delete this")
  429.     Delete1.cmd = "del"
  430.  
  431.     return [Force1, qmenu.sep, Cancel1, qmenu.sep, Cut1, Copy1, Delete1]
  432.  
  433. # ----------- REVISION HISTORY ------------
  434. #
  435. #
  436. #$Log: mapmenus.py,v $
  437. #Revision 1.12  2003/12/13 22:13:39  cdunde
  438. #To add new Grid in 2D views feature plugin menu to Options menu
  439. #
  440. #Revision 1.11  2003/07/04 19:59:57  cdunde
  441. #To add new Addons main menu item and sub-menus
  442. #
  443. #Revision 1.10  2003/03/21 05:57:05  cdunde
  444. #Update infobase and add links
  445. #
  446. #Revision 1.9  2003/02/01 07:37:50  cdunde
  447. #To add Cancel Selections to RMB menu
  448. #
  449. #Revision 1.8  2001/07/27 11:32:57  tiglari
  450. #bsp study: special commands menu when bsp is loaded
  451. #
  452. #Revision 1.7  2001/04/28 02:21:04  tiglari
  453. #move 'remove' to mapselection.py, add selection menu therefrom
  454. #
  455. #Revision 1.6  2001/03/20 07:59:40  tiglari
  456. #customizable hot key support
  457. #
  458. #Revision 1.5  2001/01/26 19:07:04  decker_dk
  459. #Clamped the scalefactors for keyboard zoom-modification to in:100 and out:0.01.
  460. #
  461. #Revision 1.4  2000/06/02 16:00:22  alexander
  462. #added cvs headers
  463. #
  464. #
  465. #